﻿namespace testCallback;
//回调模式通常是通过将一个方法(通常是委托或具有回调方法的接口)作为参数传递给另一个方法或类
//在某一事件发生时被调用。
class Program
{
    static void Main(string[] args)
    {
        // 实例化 Messenger
        Messenger messenger = new Messenger();
        // 创建 Stock 实例时，将 Messenger 的 Alert 方法作为回调传递
        Stock stock = new Stock(messenger.Alert);
        // 改变股票的价格，将会触发回调方法
        stock.Price = 120m;  // 当价格变化时，Alert 方法被调用
    }
    // 委托是对方法的抽象和封装，间接的调用方法，可以声明在类的内部或者外部
    // 事件本质上是类提供给外部的订阅通知机制
    public delegate void PriceChangedCallback(decimal oldPrice, decimal newPrice);
    public class Stock
    {
        private decimal price;
        private readonly PriceChangedCallback onPriceChanged;
        public Stock(PriceChangedCallback callback)
        {
            onPriceChanged = callback;
        }
        public decimal Price
        {
            get { return price; }
            set
            {
                if (price != value)
                {
                    decimal oldPrice = price;
                    price = value;
                    // 调用回调函数
                    onPriceChanged?.Invoke(oldPrice, price);
                }
            }
        }
    }
    public class Messenger
    {
        public void Alert(decimal oldPrice, decimal newPrice)
        {
            Console.WriteLine($"Stock price changed from {oldPrice} to {newPrice}");
        }
    }
}
